package com.doit.day06

import com.doit.day01.Person

object _02_模式匹配 {
  def main(args: Array[String]): Unit = {
    val name = "zss"

    //值匹配
    name match {
      case "lss" => println("我不是lss，我是zss")
      case "ww" => println("我不是ww这个二傻子")
      case "mingge" => println("我是zss，不是xiaoming")
      case "zss1" => println("终于等到你")
      case _ => println("啥也不是")
    }

   val id:Int = 10
   val res: String = id match {
      case 1 => "是1"
      case 2 => "是2"
      case 10 => "是10"
      case _ => "mingge"
    }
    println(res)

    val age = 8

    //if i >10  模式守卫
    age match {
      case i if i >10 =>
      case i if i >5 => println("我的值是"+i)
      case i if i >3 => println("呵呵")
      case _ => "zzz"
    }

    //匹配类型
    val i :Array[Any] = Array("a",1,1.0,'a',true)
    for (elem <- i) {
      elem match {
        case a:Int => println("这是一个int类型，他的值是："+a)
        case b:String => println("这是一个String类型，他的值是："+b)
        case c:Char =>println("这是一个Char类型，他的值是："+c)
        case _ => println("我也不知道是个什么类型")
      }
    }


    //匹配数组
    var arr1: Array[Array[Any]] = Array(
                     Array(0),
                     Array(1, 0),
                     Array(0, 1, 0),
                     Array(1, 1, 0),
                     Array(1, 1, 0, 1),
                     Array("hello", 90)
    )

    for (arr <- arr1) { // 对
//      一个数组集合进行遍历
      val result = arr match {
        case Array(0) => "这是一个数组，并且数组中只有一个元素，这个元素是0"
        case Array(x, y) => "这是一个数组，数组里面有两个元素,两个元素分别是"
        case Array(0, _) => "这是一个数组，数组里面有两个元素，第一个元素必须是0"
        case Array(_,1,_*) => "数组中至少有2个元素，并且第二个元素必须是1"
        case _ => "something else"
      }
      println("result = " + result)
    }

    //匹配元祖
    for (tuple <- Array((0, 1), (1, 0), (1, 1), (1, 0, 2))) {
      val result = tuple match {
        case (0, _) => "二元元祖，并且第一个元素是0"
        case (y, 0) => "" + y + "0" // 匹配后一个元素是 0 的对偶元组
        case (a, b) => "" + a + " " + b
        case _ => "something else" //默认
      }
      println(result)
    }


    //匹配对象  解构匹配
    val user: Any = User("zhangsan", 11)
    val result = user match {
      case User("zhangsan", 11) => "yes"
      case User("lss",18) => "no"
      case Tig(1,"zss")=> "nooo"
      case _ => "no"
    }
    println(result)


    //还有其他的用法  不过一般情况下不用
    val (id1,name1) = (1,"zss")
    val id2 = 1
    val name3 = "zss"

    val map: Map[Int, String] = Map((1, "zss"), (2, "lss"), (3, "ww"))

    



  }
}

case class Tig(id:Int,name:String)

class User(val name: String, val age: Int)

object User{
  def apply(name: String, age: Int): User = new User(name, age)
  def unapply(user: User): Option[(String, Int)] =  Some(user.name, user.age)
}


